import h3
import os
from .map_converter import *
from ..config.config import GlobalConfiguration



def build_pyramid(map, output_dir="output/pyramid_bins"):
    """
    按照指定 resolution 构建金字塔区域层级，并导出每个区域内的 cell 为 bin 文件
    :param map: 原始 Map 对象
    :param resolution: H3 resolution，用于生成父格网
    :param output_dir: 导出文件路径
    """
    os.makedirs(output_dir, exist_ok=True)
    # 获取整个区域覆盖的 H3 索引（父格网）
    parent_indexes = h3.polyfill_geojson(map.map_range, GlobalConfiguration.pyramid_resolution)

    map.pyramid_indexes = parent_indexes  # 可选存储

    for parent_index in parent_indexes:
        # 获取该父格网下所有子格网
        children_set = h3.h3_to_children(parent_index, GlobalConfiguration.h3_resolution)  # 获取子格网（更细一级）

        # 新建一个子地图，只保留当前区域的格网 cell
        sub_map = map.__class__()  # 假设你用的是 Map 类，可以被复用
        sub_map.map_range = h3.h3_to_geo_boundary(parent_index, geo_json=False)  # 设置该区域的边界

        for child_index in children_set:
            if child_index in map.cells:
                sub_map.add_cell(map.cells[child_index])  # 保留子格网的 cell 到子地图中

        # 保存这个小 map（区域）的 .bin 文件
        filename = os.path.join(output_dir, f"{parent_index}.bin")
        save_map(sub_map, filename)


def get_pyramid_map(map, start, end, bin_dir="output/pyramid_bins"):
    """
    根据二级索引进行粗略路径规划，获取所有父格网索引
    并加载区域对应的bin文件，构建小格网地图
    :param map: 原始完整地图对象（只为类型参考）
    :param start: 起点坐标 (lat, lon)
    :param end_coord: 终点坐标 (lat, lon)
    :param resolution: H3 二级索引分辨率（如 8）
    :param bin_dir: bin 文件路径前缀
    :return: pyramid_map : Map 类型对象（包含 cells 字典）
    """
    start_index = h3.geo_to_h3(start[0], start[1], GlobalConfiguration.h3_resolution)
    end_index = h3.geo_to_h3(end[0], end[1], GlobalConfiguration.h3_resolution)

    # 起点/终点所属父格网（H3大格网索引）
    start_parent = h3.h3_to_parent(start_index, GlobalConfiguration.pyramid_resolution)
    end_parent = h3.h3_to_parent(end_index, GlobalConfiguration.pyramid_resolution)

    # 使用 h3_line 得到路径经过的所有大格网
    parent_indexes = h3.h3_line(start_parent, end_parent)

    # 构建新的 Map 对象，用于承载小格网
    pyramid_map = map.__class__()

    for parent_index in parent_indexes:
        bin_path = os.path.join(bin_dir, f"{parent_index}.bin")

        if not os.path.exists(bin_path):
            print(f"Warning: bin file not found for region {parent_index}")
            continue

        sub_map =load_map(bin_path)  # 应返回一个 Map 对象或包含 cells 的对象
        pyramid_map.cells.update(sub_map.cells)  # 合并 cell 索引到新的 pyramid_map

    return pyramid_map





